<?php


class TbfPath {
    /**
     * 将多个文件路径 链接起来,
     * 保证连接的地方不会出现多个/ 或 \
     * @param string $path1
     * @param string $path2
     * ...
     */
    public static function filePathJoin($path1,$path2)
    {
        return self::joinPathArrayBySeparator(func_get_args(),DIRECTORY_SEPARATOR );
    }
    /**
     * 将多个url使用/链接起来,
     * 保证连接的地方不会出现多个/
     * @param string $path1
     * @param string $path2
     * ...
     */
    public static function urlJoin($path1,$path2)
    {
        return self::joinPathArrayBySeparator(func_get_args(),'/');
    }

    /**
     * 将url中的连续的多个/转成一个/,
     * 但是不处理'://'
     * :/// => ://
     * 使用状态机
     * 1 start :->2 /->5 other->1 end->end
     * 2 :->2 /->3 other->1 end->end
     * 3 :->2 /->4 other->1
     * 4 :->2 /->6 other->1
     * 5 :->2 /->6 other->1
     * 6 :->2 /->6 other->1 删除上一个字符
     * 7 end
     * @param $url
     */
    public static function normalUrl($url){
        $len = strlen($url);
        $status = 1;
        // 遇到/的状态转义表
        $status_table = array(
            1=>5,2=>3,3=>4,4=>6,5=>6,6=>6
        );
        $output = '';
        for($i=0;$i<$len;$i++){
            $c = $url[$i];
            if ($c===':'){
                $status=2;
                $output.=$url[$i];
                continue;
            }
            if ($c==='/'){
                $status=$status_table[$status];
                if ($status !==6){
                    $output.=$url[$i];
                }
                continue;
            }
            $status = 1;
            $output.=$url[$i];
        }
        return $output;
    }

    protected static function joinPathArrayBySeparator($path_array,$separator){
        if (count($path_array)>2){
            $last_path = array_pop($path_array);
            $join_first = self::joinPathArrayBySeparator($path_array,$separator);
            return self::joinPathArrayBySeparator(array($join_first,$last_path),$separator);
        }

        if (count($path_array)===1){
            return $path_array[0];
        }
        if (count($path_array)===2){
            $path1 = rtrim($path_array[0],$separator);
            $path2 = ltrim($path_array[1],$separator);
            return $path1.$separator.$path2;
        }
        return '';
    }

    /**
     * 获取文件扩展名,url和文件目录都可以,
     * 没有扩展名返回''
     * 目录里面的.不算入扩展名
     */
    public static function getExtension($path){
        $path = basename($path);
        $pos = strrpos($path,'.');
        if ($pos===false){
            return '';
        }
        return substr($path,$pos+1);
    }
    /**
     * 获取某个路径相对于另一个路径的相对路径
     * 可以用于url和file
     * 相对路径开头没有/
     * @return string|null null表示没找到,或者两个路径是一样的
     */
    public static function getRelativePathTo($base_path,$long_path){
        if (strpos($long_path,$base_path)!==0){
            return null;
        }
        $relative_path = substr($long_path,strlen($base_path));
        $relative_path = ltrim($relative_path,'/\\');
        if (empty($relative_path)){
            return null;
        }
        return $relative_path;
    }
} 